/*
 *  IDT.h
 *  xD-OS
 *
 *  Created by James Johns on 23/07/2009.
 *  Copyright 2009 xD-Dunce. All rights reserved.
 *
 */


#ifndef IDT_H
#define IDT_H

#include "global.h"
#include "IRQ.h"

struct regs_s {
	dWord ds;
	dWord edi, esi, ebp, esp, ebx, edx, ecx, eax;
	dWord int_no, err_code;
	dWord eip, cs, eflags, useresp, ss;
} __attribute__((packed));

struct IDT_descriptor {
	Word offsetLow;
	Word selector;
	Byte zero;
	Byte attribute;
	Word offsetHigh;
} __attribute__((packed));

struct IDT_table {
	Word size;
	dWord address;
} __attribute__((packed));

typedef struct regs_s regs;
typedef void (*ISR)(regs registers);

struct IDT_descriptor idt_table[256];
struct IDT_table idt;
ISR isr_routines[256];


void initIDT();
void addIDTEntry(Byte entryNum, dWord handler, Word selector, Byte flags);
void isr_handler(struct regs_s registers);
void addServiceRoutine(dWord entryNum, void *isrRoutine);

extern void loadIDT(dWord address);



extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();
extern void isr5();
extern void isr6();
extern void isr7();
extern void isr8();
extern void isr9();
extern void isr10();
extern void isr11();
extern void isr12();
extern void isr13();
extern void isr14();
extern void isr15();
extern void isr16();
extern void isr17();
extern void isr18();
extern void isr19();
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();




#endif

